<?php

namespace App\Service;

use App\Core\Rpc\Client;

/**
 * 存储中心
 * @author lihaiping
 */
class StorageService extends Client
{
    /**
     * 定义对应服务提供者的服务名称
     * @var string
     */
    protected $serviceName = 'StorageService';

    /**
     * 定义对应服务提供者的服务协议
     * @var string
     */
    protected $protocol = 'jsonrpc-http';

    /**
     * The load balancer of the client, this name of the load balancer
     * needs to register into \Hyperf\LoadBalancer\LoadBalancerManager.
     *
     * @var string
     */
    protected $loadBalancer = 'random';

    /**
     * 获取所有的指定文件url
     * @param string $file
     * @return string
     */
    public function getUrl(string $file): string
    {
        if (!$file) {
            return '';
        }

        $baseUrl = trim(config('storage_base_url'), '/');
        return $baseUrl.'/'.trim($file, '/');
    }

    /**
     * 批量获取所有的指定文件url
     * @param string $file
     * @return string
     */
    public function getUrls(array $files): array
    {
        if (!$files) {
            return [];
        }
        $baseUrl = trim(config('storage_base_url'), '/');
        foreach ($files as $index => $file) {
            $files[$index] = $baseUrl . '/' . trim($file, '/');
        }

        return $files;
    }

    /**
     * 复制文件
     * @param string $source 源文件
     * @param string $to 目标文件
     * @return array
     */
    public function copy(string $source, string $to): array
    {
        return $this->__request(__FUNCTION__, compact('source', 'to'));
    }

    /**
     *  异步复制文件
     * @param string $rpcName
     * @param string $modelClass
     * @param $modelId
     * @param array $params
     * @return bool
     */
    public function asynCopy(string $modelClass, $modelId, array $params): bool
    {
        return $this->__request(__FUNCTION__, [
            'rpcName' => 'CourseCenterStorage',
            'modelClass' => $modelClass,
            'modelId' => $modelId,
            'params' => $params
        ]);
    }

    /**
     * 文件转码
     * @param string $rpcName
     * @param string $modelClass
     * @param array $params
     * @return bool
     */
    public function fileTranscode(string $modelClass, int $modelId, array $params): bool
    {
        return $this->__request(__FUNCTION__, [
            'rpcName' => 'CourseCenterStorage',
            'modelClass' => $modelClass,
            'modelId' => $modelId,
            'params' => $params
        ]);
    }

    /**
     * 删除文件
     * @param string $file
     * @return bool
     */
    public function delete(string $file): bool
    {
        return $this->__request(__FUNCTION__, compact('file'));
    }
}
